﻿using System;
using System.Data.Linq;
using System.Web;
using System.Linq;
using Matrix_network.Code;

namespace Matrix_network.HttpHandlers
{
    public class ChangePasswordHandler : IHttpHandler
    {
        /// <summary>
        /// Вам потребуется настроить этот обработчик в файле web.config вашего 
        /// веб-узла и зарегистрировать его с помощью IIS, чтобы затем воспользоваться им.
        /// Дополнительные сведения см. по ссылке: http://go.microsoft.com/?linkid=8101007
        /// </summary>

        private MatrixDataClassesDataContext _dataContext = new MatrixDataClassesDataContext();

        #region IHttpHandler Members

        public bool IsReusable
        {
            // Верните значение false в том случае, если ваш управляемый обработчик не может быть повторно использован для другого запроса.
            // Обычно значение false соответствует случаю, когда некоторые данные о состоянии сохранены по запросу.
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            var result = ChangePasswordResult.UndefinedError;
            try
            {
                var request = context.Request;
                var user = context.User;

                var oldPassword = request.Form["oldPassword"];
                var password = request.Form["password"];
                var passwordRetype = request.Form["passwordRetype"];
                
                if (!user.Identity.IsAuthenticated)
                {
                    result = ChangePasswordResult.NotAuth;
                    return;
                }

                if (string.IsNullOrEmpty(password))
                {
                    result = ChangePasswordResult.PasswordNotSet;
                    return;
                }

                if (password != passwordRetype)
                {
                    result = ChangePasswordResult.PasswordNotMatch;
                    return;
                }

                var userId = user.Identity.UserId();
                var dbUser = _dataContext.users.First(item => item.id == userId);

                var salt = dbUser.salt;

                var oldDbPassword = dbUser.pass.ToArray();
                var oldCheckingPassword = MatrixData.HashPassword(oldPassword, salt);

                if (!CopmarePasswords(oldDbPassword, oldCheckingPassword))
                {
                    result = ChangePasswordResult.IncorrectOldPassword;
                    return;
                }

                dbUser.pass = new Binary(MatrixData.HashPassword(password, salt));
                _dataContext.SubmitChanges();

                result = ChangePasswordResult.Success;
            }
            finally 
            {
                var response = context.Response;
                response.Output.Write(result.ToString());
                response.Output.Close();
            }
        }

        private static bool CopmarePasswords(byte[] oldDbPassword, byte[] oldCheckingPassword)
        {
            if (oldDbPassword.Length != oldCheckingPassword.Length)
                return false;

            for (var i = 0; i < oldDbPassword.Length; i++)
                if (oldDbPassword[i] != oldCheckingPassword[i])
                    return false;

            return true;
        }

        #endregion
    }

    public enum ChangePasswordResult
    {
        Success,
        NotAuth,
        PasswordNotSet,
        PasswordNotMatch,
        IncorrectOldPassword,
        UndefinedError
    }
}
